
useRef 是 React 提供的內建 Hooks 之一,它用於創建一個稱為 ref 的物件,這個 ref 可以用來儲存和訪問在多次渲染之間需要保留的資料。useRef 在操作 DOM 元素、處理焦點、保存前一個狀態等方面非常有用。
useRef 的一個主要用途是選擇和操作 DOM 元素。以下是一個範例,展示了如何使用 useRef 選擇一個輸入框元素並自動聚焦:
function App() {
  const inputEl = useRef(null);
  useEffect(() => {
    // 使用 inputEl.current 來訪問 DOM 元素
    inputEl.current.focus();
  }, []);
  return (
    <input ref={inputEl} />
  );
}
在上面的程式碼範例中,我們使用 useRef 創建了一個名為 inputEl 的 ref,並將其設置為 input 元素的 ref。我們可以在 useEffect 中使用 inputEl.current 來訪問和操作這個 DOM 元素。
現在,讓我們進一步改進我們的範例,實現一個按 Enter 鍵自動聚焦輸入框並清空輸入內容的功能。
function App() {
  const inputEl = useRef(null);
  const [query, setQuery] = useState('');
  useEffect(() => {
    const handleKeyPress = (e) => {
      if (e.code === "Enter") {
        inputEl.current.focus();
		setQuery('');
      }
    };
	// 副作用
    document.addEventListener('keydown', handleKeyPress);
	// Cleanup Function 清除副作用
    return () => {
      document.removeEventListener('keydown', handleKeyPress);
    };
  }, [query]);
  return (
    <input
      ref={inputElement}
      value={query}
      onChange={(e) => setQuery(e.target.value)}
    />
  );
}
在這個示例中,我們使用 useRef 創建了一個 inputEl 的 ref,並且使用 useState 來管理輸入框的值。我們使用 useEffect 監聽全局的 keydown 事件,並且檢查按下的鍵是否是 Enter 鍵。
useRef 可以幫助我們選擇和操作 DOM 元素,以及儲存需要在多次渲染之間保留的資料。useRef 創建的 ref 物件的 current 屬性是可變的,但不會觸發元件重新渲染。useEffect 中訪問和操作 DOM 元素。useRef 可以用於各種場景,包括輸入框自動聚焦、儲存 DOM 元素引用和處理特定的交互功能。useRef 和 useState 有一些相似之處,但也有一些重要的區別:
相似之處:
不同之處:
useState)會觸發元件重新渲染,而更新 ref(使用 useRef)則不會。current 值。useRef 可用於保存狀態和操作 DOM 元素,藉助 useRef,可以更輕鬆地處理需要在多次渲染之間保留的資料,同時也可以更輕鬆地操作 DOM 元素。
這邊要特別注意,ref 通常用於不會直接影響元件的畫面顯示,如果資料需要參與元件的顯示,那麼應該使用狀態而不是 ref。